package 链表;

import java.util.ArrayList;
import java.util.List;

public class No725分隔链表 {

    /**
     * 给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。
     * 每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1，也就是说可能有些部分为 null。
     * 这k个部分应该按照在链表中出现的顺序进行输出，并且排在前面的部分的长度应该大于或等于后面的长度。
     * 返回一个符合上述规则的链表的列表。
     *
     * 示例 1：
     * 输入:
     * root = [1, 2, 3], k = 5
     * 输出: [[1],[2],[3],[],[]]
     * 解释:
     * 输入输出各部分都应该是链表，而不是数组。
     * 例如, 输入的结点 root 的 val= 1, root.next.val = 2, \root.next.next.val = 3, 且 root.next.next.next = null。
     * 第一个输出 output[0] 是 output[0].val = 1, output[0].next = null。
     * 最后一个元素 output[4] 为 null, 它代表了最后一个部分为空链表。
     *
     * 示例 2：
     * 输入:
     * root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
     * 输出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
     * 解释:
     * 输入被分成了几个连续的部分，并且每部分的长度相差不超过1.前面部分的长度大于等于后面部分的长度。
     */

    //便捷写法应该是两个for,一个外for控制k,一个内for控制单个下标个数
    public static ListNode[] splitListToParts(ListNode root, int k){

        int count=0;
        ListNode cur=root;
        while (cur!=null){
            count++;
            cur=cur.next;
        }

        int quotient =  count/k;//商(每个几个?)
        int remainder = count%k;//余数,前面几个每个分配1个

        ListNode[] arr=new ListNode[k];

        cur=root;

        for(int i=0;i<k;i++){

            ListNode listNode=new ListNode();
            listNode.next=cur;
            ListNode op=null;
            int more=remainder==0?0:remainder--;

            //一次只给一个
            for(int j=0;j<quotient+(more==0?0:1);j++){

                op=cur;
                cur=cur==null?null:cur.next;

            }

            if(op!=null)//防止给的k太大,第二个for进不去的情况
                op.next=null;

            arr[i]=listNode.next;

        }

        return arr;
    }

    public static ListNode[] splitListToPartsGood(ListNode root, int k) {
        ListNode cur = root;
        int N = 0;
        while (cur != null) {
            cur = cur.next;
            N++;
        }

        int width = N / k, rem = N % k;

        ListNode[] ans = new ListNode[k];
        cur = root;
        for (int i = 0; i < k; ++i) {
            ListNode head = new ListNode(0);
            ListNode write = head;
            for (int j = 0; j < width + (i < rem ? 1 : 0); ++j) {
                write.next = cur;
                write =write.next;
                if (cur != null)
                    cur = cur.next;
            }
            ans[i] = head.next;
        }
        return ans;
    }

    public static void main(String[] args) {
        int[] arr=new int[]{0, 1, 2, 3, 4, 5,6,7,8,9,10};
        ListNode listNode = ListNode.createListNode(arr);
        ListNode[] nodeArr = splitListToParts(listNode, 3);
        for (ListNode node : nodeArr) {
            ListNode.printListNode(node);
            System.out.println("-------");
        }
    }

}
